#include "Entidad.h"

Entidad::Entidad(Mapa* _mapa, const Punto& posicion_inicial)
{
	mapa = _mapa;
	assert(mapa->PuedoOcupar(posicion_inicial));
	posicion = posicion_inicial;
	mapa->Ocupar(posicion);
	// TODO: que esto sea dinamico. Es bastante cabeza.
	orientacion = N;
	moviendo = false;
}

void Entidad::Mover(const Orientacion_t _orientacion)
{
	Punto nueva_posicion = posicion + direcciones[_orientacion];
	if (!moviendo)
	{
		orientacion = _orientacion;
		if (mapa->PuedoOcupar(nueva_posicion))
		{
			mapa->Desocupar(posicion);
			posicion = nueva_posicion;
			mapa->Ocupar(posicion);
			ComenzarMovimiento();
		}
	}
}

Punto Entidad::Posicion() const				{ return posicion;	}
int Entidad::Velocidad() const				{ return velocidad;	}
Orientacion_t Entidad::Orientacion() const	{ return orientacion; }
Evento& Entidad::AlMoverse() 				{ return evento_al_moverse; }
Evento& Entidad::AlPararse() 				{ return evento_al_pararse; }

void Entidad::ComenzarMovimiento()
{
	moviendo = true;
	evento_al_moverse.Notificar();

//	cout << "Comenzando movimiento" << endl;

	callback_al_finalizar_movimiento = Callback<Entidad>(this,&Entidad::FinalizarMovimiento);
	Core::Instancia()->AgregarAlarma(1,velocidad,&callback_al_finalizar_movimiento);
}

void Entidad::FinalizarMovimiento()
{
//	cout << "terminando movimiento" << endl;

	moviendo = false;
	evento_al_pararse.Notificar();
}
